package cn.com.w.bootdemo.service;

import cn.com.w.bootdemo.annotation.Banklimit;

import java.lang.reflect.Method;

/**
 * 模拟银行转账业务
 *
 * APT技术
 * APT(Annotation Process Tool)，是一种在代码编译时处理注解，按照一定的规则，生成相应的java文件，
 * 多用于对自定义注解的处理，目前比较流行的Dagger2, ButterKnife, EventBus3都是采用APT技术，
 * 对运行时的性能影响很小。
 */
public class BankService {

    /**
     * 开始转账
     * @param args
     */
    public static void main(String[] args){
        TransferMoney(100001);
    }


    /**
     * @param money 转账金额
     */
    @Banklimit(maxMoney = 15000)
    public static void TransferMoney(double money){
        System.out.println(processAnnotationMoney(money));

    }


    /**
     * 处理提取和处理 Annotation 的代码统称为 APT（Annotation Processing Tool)。
     * 转账例子中的processAnnotationMoney方法就可以理解为APT工具类。
     * @param money
     * @return
     */
    private static String processAnnotationMoney(double money) {
        try {
            Method transferMoney = BankService.class.getDeclaredMethod("TransferMoney",double.class);
            boolean annotationPresent = transferMoney.isAnnotationPresent(Banklimit.class);
            if(annotationPresent){
                Banklimit annotation = transferMoney.getAnnotation(Banklimit.class);
                double l = annotation.maxMoney();
                if(money>l){
                    return "转账金额大于限额，转账失败";
                }else {
                    return"转账金额为:"+money+"，转账成功";
                }
            }
        } catch ( NoSuchMethodException e) {
            e.printStackTrace();
        }
        return "转账处理失败";
    }

}
